package com.um.jdy.ykc.netty;

import io.netty.channel.ChannelHandlerContext;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 客户端socket 管理类
 *
 * @author 邓南辉
 * @date 2020/2/13
 * @copyright 广州优匠科技有限公司
 */
public class NettyContextHolder {

    //管理context及未发心跳间隔次数
    private static final Map<String, Integer> mapContextIdle = new ConcurrentHashMap<>(16);
    //管理context与设备编码关联
    private static final Map<String, ChannelHandlerContext> mapDeviceContext = new ConcurrentHashMap<>(16);

    /**
     * 删除客户端 context
     *
     * @param ctx context
     */
    public static Integer removeContext(ChannelHandlerContext ctx) {
        mapDeviceContext.entrySet().stream().filter(entry -> entry.getValue() == ctx).forEach(entry -> mapDeviceContext.remove(entry.getKey()));
        return mapContextIdle.remove(ctx.channel().id().asLongText());
    }

    /**
     * 累加未发心跳次数 +1
     *
     * @param id 客户端context标识
     */
    public static Integer increaseIdleNum(String id) {
        int num = mapContextIdle.getOrDefault(id, 0);
        mapContextIdle.put(id, ++num);
        return num;
    }

    /**
     * 重置未发心跳次数
     *
     * @param id 客户端context标识
     */
    public static Integer resetIdleNum(String id) {
        return mapContextIdle.put(id, 0);
    }

    /**
     * 删除客户端未发心跳的次数
     *
     * @param id 客户端context标识
     */
    public static Integer removeIdleNum(String id) {
        return mapContextIdle.remove(id);
    }

    /**
     * 添加桩编码与context关联
     *
     * @param imei
     * @param ctx
     */
    public static ChannelHandlerContext putDeviceContext(String imei, ChannelHandlerContext ctx) {
        return mapDeviceContext.put(imei, ctx);
    }

    /**
     * 通过桩编码获得context
     *
     * @param imei
     * @return
     */
    public static ChannelHandlerContext getDeviceContext(String imei) {
        return mapDeviceContext.get(imei);
    }

    //管理客户端ID及心跳次数
    private static final Map<String, Integer> mapHeart = new ConcurrentHashMap<>(16);

    /**
     * 获得心跳的次数
     *
     * @param id 客户端socket标识
     * @return
     */
    public static Integer getHeartNum(String id) {
        if (mapHeart.containsKey(id)) {
            Integer num = mapHeart.get(id);
            num++;
            if (num > 65535)
                num = 1;
            mapHeart.put(id, num);

            return num;
        } else {
            mapHeart.put(id, 1);
            return 1;
        }
    }

}
